26 template<
class P,
class D>
31 Cell3D(Point<P> * positions, D * vectors);
32 void setData(D * vectors);
33 void setPositions(Point<P> * positions);
36 Vector<D> getDeltas();
37 Point<P> * getPositions();
38 Point<P> * getPosition(
int i);
39 std::vector<int> getDataForFace(
int i);
40 std::vector<std::vector<int> > getTriangles();
41 std::string toString();
43 std::deque<Cell3D<P, D> *> getChildren();
44 D interpolateData(Point<P>& point);
45 D interpolateData(
const P& c0,
const P& c1,
const P& c2);
49 Point<P> positions[8];
57 template<
class P,
class D>
58 Cell3D<P, D>::Cell3D()
70 template<
class P,
class D>
71 Cell3D<P, D>::Cell3D(Point<P> positions[], D data[])
73 for (
int i = 0; i < 8; i++)
75 this->data[i] = data[i];
76 this->positions[i] = positions[i];
79 dx =
abs(positions[0].c0() - positions[1].c0());
80 dy =
abs(positions[0].c1() - positions[4].c1());
81 dz =
abs(positions[0].c2() - positions[2].c2());
84 template<
class P,
class D>
85 void Cell3D<P, D>::setData(D data[])
87 for (
int i = 0; i < 8; i++)
89 this->data[i] = data[i];
93 template<
class P,
class D>
94 void Cell3D<P, D>::setPositions(Point<P> positions[])
96 for (
int i = 0; i < 8; i++)
98 this->positions[i] = positions[i];
101 dx =
abs(positions[0].c0() - positions[1].c0());
102 dy =
abs(positions[0].c1() - positions[4].c1());
103 dz =
abs(positions[0].c2() - positions[2].c2());
106 template<
class P,
class D>
107 D* Cell3D<P, D>::getData()
112 template<
class P,
class D>
113 D* Cell3D<P, D>::getData(
int i)
125 template<
class P,
class D>
126 std::vector<int> Cell3D<P, D>::getDataForFace(
int i)
128 std::vector<int> dataOnFace = std::vector<int>(4);
177 template<
class P,
class D>
178 std::vector<std::vector<int> > Cell3D<P, D>::getTriangles()
194 std::vector<std::vector<int> > triangles = std::vector<std::vector<int> >(12);
195 for (
int i = 0; i < 12; i++)
197 triangles[i] = std::vector<int>(3);
201 for (
int i = 0; i < 6; i++)
203 std::vector<int> dataOnFace = getDataForFace(i);
207 triangles[i2][0] = dataOnFace[1];
208 triangles[i2][1] = dataOnFace[3];
209 triangles[i2][2] = dataOnFace[0];
211 triangles[i21][0] = dataOnFace[3];
212 triangles[i21][1] = dataOnFace[2];
213 triangles[i21][2] = dataOnFace[0];
256 template<
class P,
class D>
257 std::string Cell3D<P, D>::toString()
259 Point<P> center = getCenter();
260 return center.toString();
264 template<
class P,
class D>
265 Point<P> Cell3D<P, D>::getCenter()
268 float x = (positions[0].c0() + positions[1].c0()) / 2.0f;
269 float y = (positions[0].c1() + positions[4].c1()) / 2.0f;
270 float z = (positions[0].c2() + positions[2].c2()) / 2.0f;
271 center.setComponents(x, y, z);
275 template<
class P,
class D>
276 std::deque<Cell3D<P, D> *> Cell3D<P, D>::getChildren()
278 std::deque<Cell3D<P, D> *> cells = std::deque<Cell3D<P, D> *>(8);
281 Cell3D<P, D> * c0 =
new Cell3D<P, D> ();
282 Cell3D<P, D> * c1 =
new Cell3D<P, D> ();
283 Cell3D<P, D> * c2 =
new Cell3D<P, D> ();
284 Cell3D<P, D> * c3 =
new Cell3D<P, D> ();
285 Cell3D<P, D> * c4 =
new Cell3D<P, D> ();
286 Cell3D<P, D> * c5 =
new Cell3D<P, D> ();
287 Cell3D<P, D> * c6 =
new Cell3D<P, D> ();
288 Cell3D<P, D> * c7 =
new Cell3D<P, D> ();
294 Point<D> p = positions[0];
295 Point<D> cPositions0[] = { Point<D> (p.c0(), p.c1(), p.c2()), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()),
296 Point<D> (p.c0(), p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f),
297 Point<D> (p.c0(), p.c1() + .5f * dy, p.c2()), Point<D> (p.c0() + .5f * dx, p.c1() + .5f * dy, p.c2()),
298 Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx,
299 p.c1() + .5f * dy, p.c2() + dz * .5f) };
300 c0->setPositions(cPositions0);
302 Point<D> cPositions1[] = { Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()),
303 Point<D> (p.c0() + dx, p.c1(), p.c2()), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f), Point<
304 D> (p.c0() + dx, p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f,
305 p.c2()), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1()
306 + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f) };
307 c1->setPositions(cPositions1);
309 Point<D> cPositions2[] = { Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx,
310 p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2() + dz), Point<D> (p.c0() + dx,
311 p.c1(), p.c2() + dz), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (
312 p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f,
313 p.c2() + dz), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz) };
314 c2->setPositions(cPositions2);
316 Point<D> cPositions3[] = { Point<D> (p.c0(), p.c1(), p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1(),
317 p.c2() + dz * .5f), Point<D> (p.c0(), p.c1(), p.c2() + dz), Point<D> (p.c0() + dx * .5f, p.c1(), p.c2()
318 + dz), Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx, p.c1()
319 + .5f * dy, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + .5f * dy, p.c2() + dz), Point<D> (p.c0()
320 + .5f * dx, p.c1() + .5f * dy, p.c2() + dz) };
321 c3->setPositions(cPositions3);
323 Point<D> cPositions4[] = { Point<D> (p.c0(), p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1()
324 + dy * .5f, p.c2()), Point<D> (p.c0(), p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx
325 * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + dy, p.c2()), Point<D> (p.c0()
326 + .5f * dx, p.c1() + dy, p.c2()), Point<D> (p.c0(), p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0()
327 + .5f * dx, p.c1() + dy, p.c2() + dz * .5f) };
328 c4->setPositions(cPositions4);
330 Point<D> cPositions5[] = { Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx,
331 p.c1() + dy * .5f, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f),
332 Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy,
333 p.c2()), Point<D> (p.c0() + dx, p.c1() + dy, p.c2()), Point<D> (p.c0() + dx * .5f, p.c1() + dy,
334 p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz * .5f) };
335 c5->setPositions(cPositions5);
337 Point<D> cPositions6[] = { Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0()
338 + dx, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2()
339 + dz), Point<D> (p.c0() + dx, p.c1() + dy * .5f, p.c2() + dz), Point<D> (p.c0() + dx * .5f,
340 p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz * .5f), Point<D> (
341 p.c0() + dx * .5f, p.c1() + dy, p.c2() + dz), Point<D> (p.c0() + dx, p.c1() + dy, p.c2() + dz) };
342 c6->setPositions(cPositions6);
344 Point<D> cPositions7[] = { Point<D> (p.c0(), p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (
345 p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz * .5f), Point<D> (p.c0(), p.c1() + dy * .5f, p.c2()
346 + dz), Point<D> (p.c0() + dx * .5f, p.c1() + dy * .5f, p.c2() + dz), Point<D> (p.c0(), p.c1() + dy,
347 p.c2() + dz * .5f), Point<D> (p.c0() + .5f * dx, p.c1() + dy, p.c2() + dz * .5f), Point<D> (p.c0(),
348 p.c1() + dy, p.c2() + dz), Point<D> (p.c0() + .5f * dx, p.c1() + dy, p.c2() + dz) };
349 c7->setPositions(cPositions7);
351 D cData0[] = { interpolateData(c0->getPositions()[0]), interpolateData(c0->getPositions()[1]), interpolateData(
352 c0->getPositions()[2]), interpolateData(c0->getPositions()[3]), interpolateData(c0->getPositions()[4]),
353 interpolateData(c0->getPositions()[5]), interpolateData(c0->getPositions()[6]), interpolateData(
354 c0->getPositions()[7]) };
369 D cData1[] = { interpolateData(c1->getPositions()[0]), interpolateData(c1->getPositions()[1]), interpolateData(
370 c1->getPositions()[2]), interpolateData(c1->getPositions()[3]), interpolateData(c1->getPositions()[4]),
371 interpolateData(c1->getPositions()[5]), interpolateData(c1->getPositions()[6]), interpolateData(
372 c1->getPositions()[7]) };
375 D cData2[] = { interpolateData(c2->getPositions()[0]), interpolateData(c2->getPositions()[1]), interpolateData(
376 c2->getPositions()[2]), interpolateData(c2->getPositions()[3]), interpolateData(c2->getPositions()[4]),
377 interpolateData(c2->getPositions()[5]), interpolateData(c2->getPositions()[6]), interpolateData(
378 c2->getPositions()[7]) };
381 D cData3[] = { interpolateData(c3->getPositions()[0]), interpolateData(c3->getPositions()[1]), interpolateData(
382 c3->getPositions()[2]), interpolateData(c3->getPositions()[3]), interpolateData(c3->getPositions()[4]),
383 interpolateData(c3->getPositions()[5]), interpolateData(c3->getPositions()[6]), interpolateData(
384 c3->getPositions()[7]) };
387 D cData4[] = { interpolateData(c4->getPositions()[0]), interpolateData(c4->getPositions()[1]), interpolateData(
388 c4->getPositions()[2]), interpolateData(c4->getPositions()[3]), interpolateData(c4->getPositions()[4]),
389 interpolateData(c4->getPositions()[5]), interpolateData(c4->getPositions()[6]), interpolateData(
390 c4->getPositions()[7]) };
393 D cData5[] = { interpolateData(c5->getPositions()[0]), interpolateData(c5->getPositions()[1]), interpolateData(
394 c5->getPositions()[2]), interpolateData(c5->getPositions()[3]), interpolateData(c5->getPositions()[4]),
395 interpolateData(c5->getPositions()[5]), interpolateData(c5->getPositions()[6]), interpolateData(
396 c5->getPositions()[7]) };
399 D cData6[] = { interpolateData(c6->getPositions()[0]), interpolateData(c6->getPositions()[1]), interpolateData(
400 c6->getPositions()[2]), interpolateData(c6->getPositions()[3]), interpolateData(c6->getPositions()[4]),
401 interpolateData(c6->getPositions()[5]), interpolateData(c6->getPositions()[6]), interpolateData(
402 c6->getPositions()[7]) };
405 D cData7[] = { interpolateData(c7->getPositions()[0]), interpolateData(c7->getPositions()[1]), interpolateData(
406 c7->getPositions()[2]), interpolateData(c7->getPositions()[3]), interpolateData(c7->getPositions()[4]),
407 interpolateData(c7->getPositions()[5]), interpolateData(c7->getPositions()[6]), interpolateData(
408 c7->getPositions()[7]) };
430 template<
class P,
class D>
431 D Cell3D<P, D>::interpolateData(Point<P>& point)
433 return interpolateData(point.c0(), point.c1(), point.c2());
436 template<
class P,
class D>
437 D Cell3D<P, D>::interpolateData(
const P& c0,
const P& c1,
const P& c2)
439 D m_x = (c0 - positions[0].c0()) / dx;
440 D m_y = (c1 - positions[0].c1()) / dy;
441 D m_z = (c2 - positions[0].c2()) / dz;
444 D vc1 = (1 - m_x) * data[0] + m_x * data[1];
445 D vc2 = (1 - m_x) * data[4] + m_x * data[5];
446 D vc3 = (1 - m_x) * data[2] + m_x * data[3];
447 D vc4 = (1 - m_x) * data[6] + m_x * data[7];
448 D vc5 = (1 - m_z) * vc1 + m_z * vc3;
449 D vc6 = (1 - m_z) * vc2 + m_z * vc4;
450 D xc = (1 - m_y) * vc5 + m_y * vc6;
455 template<
class P,
class D>
456 Point<P> * Cell3D<P, D>::getPositions()
461 template<
class P,
class D>
462 Point<P> * Cell3D<P, D>::getPosition(
int i)
464 return &(positions[i]);
467 template<
class P,
class D>
468 Vector<D> Cell3D<P, D>::getDeltas()
470 return Vector<D> (dx, dy, dz);
473 template<
class P,
class D>
474 Cell3D<P, D>::~Cell3D()